昨天準備好了control center主機上所需要的各項工具,今天就可以來編寫iac的腳本了。
terraform腳本基本上會由兩個元件組成provider和resources,provider定義要在哪個環境上做事,如我的範例使用gcp那麼最簡單的provider寫法如下
provider "google" {
credentials = “service account key”
project = “project id”
region = “region name”
}
terraform在看到這個provider後會知道可以用這個service account在這個project id 的這個region上創建resources。
而resource的寫法範例如下
variable "instance_name" {}
variable "instance_zone" {}
variable “instance_type" {
default = "custom-8-16384-ext"
}
resource "google_compute_instance" "default" {
name = "${var.instance_name}"
zone = "${var.instance_zone}"
machine_type = "${var.instance_type}"
boot_disk {
initialize_params {
image = "centos-cloud/centos-7"
size = 100
}
}
network_interface {
subnetwork = "default"
access_config {
}
}
metadata = {
ssh-keys = "root:${file("/root/.ssh/id_rsa.pub")}"
}
metadata_startup_script = "sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config ; systemctl restart sshd"
}
output "ip" {
value = google_compute_instance.default.network_interface.0.network_ip
}
terraform會得到一個宣告的resource,請他產生一台主機名字和zone會由變數帶入,instance規格為8 core 16G,os使用centos7 並且容量為100G,網路設定為default,帶入目前主機的ssh key並且設定root可以遠端登入,完成的時候output ip,這樣就可以做為一個terraform的模板使用,讓我在剛剛定義的provider.tf中加入以這個module為框架的主機
module "create_ithome2021” {
source = “./lab”
instance_name = “ithome-2021-1”
instance_zone = "asia-east1-b"
}
這樣的寫法有一個好處,我只要在provider中加入三組同樣的module就可以得到三台同樣規格的主機,同時我需要新增別的module例如網路 防火牆的設定也可以很彈性的加入。
因為我沒有要講述複雜的網路使用情境,所以單純使用上述的module配置即可輕易的完成要建立k8s和之後需要擴充時所需要的主機。
那麼下一個問題是,如何輕易的重複利用這個provider宣告資源呢?
使用terraform apply之後,可以發現在當前的provider路徑下會得到一個terraform.tfstate,這個檔案說明了宣告的resources透過terraform創建出來的資訊,如果在同一個路徑下繼續創建資源,那麼原有的資源將會被覆蓋掉,但是對於terraform其實他的概念並不是覆蓋而是異動。
因此我使用了階層的方式進行管理讓彼此的resource獨立不互相影響,如下範例
透過terraform可以輕鬆的佈建環境,但是風險就是要是不小心異動錯了,就會非常的痛,所以管理上一定要非常的小心,有了基本的環境後,明天就可以開始用ansible進行kuberbetes的安裝了。